<?php
// $Id: EbatNs_Session.php,v 1.1 2007/05/31 11:38:00 michael Exp $
/* $Log: EbatNs_Session.php,v $
/* Revision 1.1  2007/05/31 11:38:00  michael
/* - initial checkin
/* - version < 513
/*
 *
 * 4     11.01.07 14:32 Charnisch
 * - trim token coming from file
 *
 * 3     3.02.06 10:44 Mcoslar
 *
 * 2     30.01.06 16:44 Mcoslar
 * ï¿½nderungen eingefï¿½gt
 */
require_once 'EbatNs_Defines.php';
/**
 */
class EbatNs_Session {
  // this array holds all attribute data of the object
  var $_props = array();
  /**
   * sets a property by name and value
   */
  function _setProp($key, $value)
  {
    $this->_props[$key] = $value;
  }
  /**
   * gets a property by name
   */
  function _getProp($key)
  {
    return $this->_props[$key];
  }
  /**
   * Read accessor of AppId.
   * The value of this property is used as the application ID in each XML request sent to the eBay API.
   *
   * @access public
   * @return string Value of the AppId property
   */
  function getAppId()
  {
    return $this->_props['AppId'];
  }
  /**
   * Write accessor of AppId.
   * The value of this property is used as the application ID in each XML request sent to the eBay API.
   *
   * @access public
   * @param string $value The new value for the AppId property
   * @return void
   */
  function setAppId($value)
  {
    $this->_props['AppId'] = $value;
  }
  /**
   * Read accessor of DevId.
   * The value of this property is used as the developer ID in each XML request sent to the eBay API.
   *
   * @access public
   * @return string Value of the DevId property
   */
  function getDevId()
  {
    return $this->_props['DevId'];
  }
  /**
   * Write accessor of DevId.
   * The value of this property is used as the developer ID in each XML request sent to the eBay API.
   *
   * @access public
   * @param string $value The new value for the DevId property
   * @return void
   */
  function setDevId($value)
  {
    $this->_props['DevId'] = $value;
  }
  /**
   * Read accessor of CertId.
   * The value of this property is used as the security certificate in each XML request sent to the eBay API.
   *
   * @access public
   * @return string Value of the CertId property
   */
  function getCertId()
  {
    return $this->_props['CertId'];
  }
  /**
   * Write accessor of CertId.
   * The value of this property is used as the security certificate in each XML request sent to the eBay API.
   *
   * @access public
   * @param string $value The new value for the CertId property
   * @return void
   */
  function setCertId($value)
  {
    $this->_props['CertId'] = $value;
  }
  /**
   * Read accessor of RequestPassword.
   * Specifies the password for the user making the API call. This value is sent in the <RequestPassword> element.
   *
   * @access public
   * @return string Value of the RequestPassword property
   */
  function getRequestPassword()
  {
    return $this->_props['RequestPassword'];
  }
  /**
   * Write accessor of RequestPassword.
   * Specifies the password for the user making the API call. This value is sent in the <RequestPassword> element.
   *
   * @access public
   * @param string $value The new value for the RequestPassword property
   * @return void
   */
  function setRequestPassword($value)
  {
    $this->_props['RequestPassword'] = $value;
  }
  /**
   * Read accessor of RequestUser.
   * Specifies the user ID making the API call. This value is sent in the <RequestUserId> element.
   *
   * @access public
   * @return string Value of the RequestUser property
   */
  function getRequestUser()
  {
    return $this->_props['RequestUser'];
  }
  /**
   * Write accessor of RequestUser.
   * Specifies the user ID making the API call. This value is sent in the <RequestUserId> element.
   *
   * @access public
   * @param string $value The new value for the RequestUser property
   * @return void
   */
  function setRequestUser($value)
  {
    $this->_props['RequestUser'] = $value;
  }
  /**
   * Read accessor of TimeOffset.
   * Time offset of the local machine from eBay official time. Whenever using Timestamps on any calls (in and out) the information will be adapted with this value.
   * Please provide a string with relative information e.g. "+0200" for a timezone which is 2 hours infront of GMT
   *
   * @access public
   * @return string Value of the TimeOffset property
   */
  function getTimeOffset()
  {
    return $this->_props['TimeOffset'];
  }
  /**
   * Write accessor of TimeOffset.
   * Time offset of the local machine from eBay official time. Whenever using Timestamps on any calls (in and out) the information will be adapted with this value.
   * Please provide a string with relative information e.g. "+0200" for a timezone which is 2 hours infront of GMT
   *
   * @access public
   * @param string $value The new value for the TimeOffset property
   * @return void
   */
  function setTimeOffset($value)
  {
    $this->_props['TimeOffset'] = $value;
  }
  /**
   * Read accessor of LogLevel.
   * Define the amount og information being logged to the LogFile. Use one of the following defines (or an AND combined value) :
   *
   * @access public
   * @return number Value of the LogLevel property
   */
  function getLogLevel()
  {
    return $this->_props['LogLevel'];
  }
  /**
   * Write accessor of LogLevel.
   * Define the amount og information being logged to the LogFile. Use one of the following defines (or an AND combined value) :
   *
   * @access public
   * @param number $value The new value for the LogLevel property
   * @return void
   */
  function setLogLevel($value)
  {
    $this->_props['LogLevel'] = $value;
  }
  /**
   * Read accessor of LogFilename.
   * Filename of the log-file. If the log-fle does not exits it will be created otherwise data gets appended. Be sure of setting write-permission to the user the php process is running as (aka www).
   * Should install a mechanism to delete or roll the file once a time to not screw up your system.
   *
   * @access public
   * @return string Value of the LogFilename property
   */
  function getLogFilename()
  {
    return $this->_props['LogFilename'];
  }
  /**
   * Write accessor of LogFilename.
   * Filename of the log-file. If the log-fle does not exits it will be created otherwise data gets appended. Be sure of setting write-permission to the user the php process is running as (aka www).
   * Should install a mechanism to delete or roll the file once a time to not screw up your system.
   *
   * @access public
   * @param string $value The new value for the LogFilename property
   * @return void
   */
  function setLogFilename($value)
  {
    $this->_props['LogFilename'] = $value;
  }
  /**
   * Read accessor of LogMode.
   * defines how to log, actually same as define in build-in error_log function :
   * 0 log to syslog (or event log on winnt)
   * 1 email (set in LogFileName)
   * 2 debugger port (set in LogFileName)
   * 3 file (set in LogFileName)
   *
   * @access public
   * @return number Value of the LogMode property
   */
  function getLogMode()
  {
    return $this->_props['LogMode'];
  }
  /**
   * Write accessor of LogMode.
   * defines how to log, actually same as define in build-in error_log function :
   * 0 log to syslog (or event log on winnt)
   * 1 email (set in LogFileName)
   * 2 debugger port (set in LogFileName)
   * 3 file (set in LogFileName)
   *
   * @access public
   * @param number $value The new value for the LogMode property
   * @return void
   */
  function setLogMode($value)
  {
    $this->_props['LogMode'] = $value;
  }
  /**
   * Read accessor of ApiMode.
   * Defines how data is accessed. Mainly switch between direct and integration access through a local datastorage. Use one of the following:
   * EBAY_CALLMODE_DIRECT = 0
   * EBAY_CALLMODE_INTEGRATION = 1
   *
   * @access public
   * @return define Value of the ApiMode property
   */
  function getApiMode()
  {
    return $this->_props['ApiMode'];
  }
  /**
   * Write accessor of ApiMode.
   * Defines how data is accessed. Mainly switch between direct and integration access through a local datastorage. Use one of the following:
   * EBAY_CALLMODE_DIRECT = 0
   * EBAY_CALLMODE_INTEGRATION = 1
   *
   * @access public
   * @param define $value The new value for the ApiMode property
   * @return void
   */
  function setApiMode($value)
  {
    $this->_props['ApiMode'] = $value;
  }
  /**
   * Read accessor of SiteId.
   * Defines the eBay Site from or to data will be sent. Use a numeric value or one of the following defines :
   * EBAY_SITE_GERMANY
   * EBAY_SITE_US
   * EBAY_SITE_ ...
   *
   * @access public
   * @return number Value of the SiteId property
   */
  function getSiteId()
  {
    return $this->_props['SiteId'];
  }
  /**
   * Write accessor of SiteId.
   * Defines the eBay Site from or to data will be sent. Use a numeric value or one of the following defines :
   * EBAY_SITE_GERMANY
   * EBAY_SITE_US
   * EBAY_SITE_ ...
   *
   * @access public
   * @param number $value The new value for the SiteId property
   * @return void
   */
  function setSiteId($value)
  {
    $this->_props['SiteId'] = $value;
  }

  function getUserID(){
	  return($this->_props['UserID']);
  }
  function setUserID($value){
    $this->_props['UserID'] = $value;
  }
  /**
   * Read accessor of CompatibilityLevel.
   *
   * @access public
   * @return string Value of the CompatibilityLevel property
   */
  function getCompatibilityLevel()
  {
    return $this->_props['CompatibilityLevel'];
  }
  /**
   * Write accessor of CompatibilityLevel.
   *
   * @access public
   * @param string $value The new value for the CompatibilityLevel property
   * @return void
   */
  function setCompatibilityLevel($value)
  {
    $this->_props['CompatibilityLevel'] = $value;
  }
  /**
   * Read accessor of ErrorLevel.
   *
   * @access public
   * @return number Value of the ErrorLevel property
   */
  function getErrorLevel()
  {
    return $this->_props['ErrorLevel'];
  }
  /**
   * Write accessor of ErrorLevel.
   *
   * @access public
   * @param number $value The new value for the ErrorLevel property
   * @return void
   */
  function setErrorLevel($value)
  {
    $this->_props['ErrorLevel'] = $value;
  }
  /**
   * Read accessor of ErrorLanguage.
   *
   * @access public
   * @return number Value of the ErrorLanguage property
   */
  function getErrorLanguage()
  {
    return $this->_props['ErrorLanguage'];
  }
  /**
   * Write accessor of ErrorLanguage.
   *
   * @access public
   * @param number $value The new value for the ErrorLanguage property
   * @return void
   */
  function setErrorLanguage($value)
  {
    $this->_props['ErrorLanguage'] = $value;
  }
  /**
   * Read accessor of RequestTimeout.
   *
   * @access public
   * @return number Value of the RequestTimeout property
   */
  function getRequestTimeout()
  {
    return $this->_props['RequestTimeout'];
  }
  /**
   * Write accessor of RequestTimeout.
   *
   * @access public
   * @param number $value The new value for the RequestTimeout property
   * @return void
   */
  function setRequestTimeout($value)
  {
    $this->_props['RequestTimeout'] = $value;
  }
  /**
   * Read accessor of TokenMode.
   *
   * @access public
   * @return boolean Value of the TokenMode property
   */
  function getTokenMode()
  {
    return $this->_props['TokenMode'];
  }
  /**
   * Write accessor of TokenMode.
   *
   * @access public
   * @param boolean $value The new value for the TokenMode property
   * @return void
   */
  function setTokenMode($value)
  {
    $this->_props['TokenMode'] = $value;
  }
  /**
   * Read accessor of TokenPickupFile.
   * will be used to pickup / store the token information for this session
   *
   * @access public
   * @return string Value of the TokenPickupFile property
   */
  function getTokenPickupFile()
  {
    return $this->_props['TokenPickupFile'];
  }
  /**
   * Write accessor of TokenPickupFile.
   * will be used to pickup / store the token information for this session
   *
   * @access public
   * @param string $value The new value for the TokenPickupFile property
   * @return void
   */
  function setTokenPickupFile($value)
  {
    $this->_props['TokenPickupFile'] = $value;
  }
  /**
   * Read accessor of TokenUsePickupFile.
   *
   * @access public
   * @return boolean Value of the TokenUsePickupFile property
   */
  function getTokenUsePickupFile()
  {
    return $this->_props['TokenUsePickupFile'];
  }
  /**
   * Write accessor of TokenUsePickupFile.
   *
   * @access public
   * @param boolean $value The new value for the TokenUsePickupFile property
   * @return void
   */
  function setTokenUsePickupFile($value)
  {
    $this->_props['TokenUsePickupFile'] = $value;
  }
  /**
   * Read accessor of ApiUrl.
   * returns the API Url
   *
   * @access public
   * @return string Value of the ApiUrl property
   */
  function getApiUrl()
  {
    return $this->_props['ApiUrl'];
  }
  /**
   * Write accessor of ApiUrl.
   * returns the API Url
   *
   * @access public
   * @param string $value The new value for the ApiUrl property
   * @return void
   */
  function setApiUrl($value)
  {
    $this->_props['ApiUrl'] = $value;
  }
  /**
   * Read accessor of AppMode.
   * defines which API server to call
   * EBAY_APPMODE_SANDBOX = 1
   * EBAY_APPMODE_QA = 2
   * EBAY_APPMODE_PRODUCTION = 0
   * EBAY_APPMODE_LOCALDEBUG = 100
   *
   * @access public
   * @return define Value of the AppMode property
   */
  function getAppMode()
  {
    return $this->_props['AppMode'];
  }
  /**
   * Read accessor of PageSize.
   *
   * @access public
   * @return number Value of the PageSize property
   */
  function getPageSize()
  {
    return $this->_props['PageSize'];
  }
  /**
   * Write accessor of PageSize.
   *
   * @access public
   * @param number $value The new value for the PageSize property
   * @return void
   */
  function setPageSize($value)
  {
    $this->_props['PageSize'] = $value;
  }
  /**
   * Read accessor of ProxyServer.
   * ProxyServer to pass down to cURL (CURLOPT_PROXY)
   * pass as a string in format "host:port"
   *
   * @access public
   * @return string Value of the ProxyServer property
   */
  function getProxyServer()
  {
    return $this->_props['ProxyServer'];
  }
  /**
   * Write accessor of ProxyServer.
   * ProxyServer to pass down to cURL (CURLOPT_PROXY)
   * pass as a string in format "host:port"
   *
   * @access public
   * @param string $value The new value for the ProxyServer property
   * @return void
   */
  function setProxyServer($value)
  {
    $this->_props['ProxyServer'] = $value;
  }
  /**
   * Read accessor of ProxyUidPwd.
   * ProxyServer to pass down to cURL (CURLOPT_PROXYUSERPWD)
   * use "name:password" as a string divided by colon
   *
   * @access public
   * @return string Value of the ProxyUidPwd property
   */
  function getProxyUidPwd()
  {
    return $this->_props['ProxyUidPwd'];
  }
  /**
   * Write accessor of ProxyUidPwd.
   * ProxyServer to pass down to cURL (CURLOPT_PROXYUSERPWD)
   * use "name:password" as a string divided by colon
   *
   * @access public
   * @param string $value The new value for the ProxyUidPwd property
   * @return void
   */
  function setProxyUidPwd($value)
  {
    $this->_props['ProxyUidPwd'] = $value;
  }
  /**
   * Read accessor of ProxyServerType.
   * ProxyServer Type to pass down to cURL
   * CURLOPT_PROXYTYPE (101)
   * CURLPROXY_HTTP = 0,
   * CURLPROXY_SOCKS4 = 4,
   * CURLPROXY_SOCKS5 = 5
   * set to EBAY_NOTHING if you are using direct access (default). The cURL operation will acutally check against this value and then use the more abritrate values ProxyXXX
   *
   * @access public
   * @return number Value of the ProxyServerType property
   */
  function getProxyServerType()
  {
    return $this->_props['ProxyServerType'];
  }
  /**
   * Write accessor of ProxyServerType.
   * ProxyServer Type to pass down to cURL
   * CURLOPT_PROXYTYPE (101)
   * CURLPROXY_HTTP = 0,
   * CURLPROXY_SOCKS4 = 4,
   * CURLPROXY_SOCKS5 = 5
   * set to EBAY_NOTHING if you are using direct access (default). The cURL operation will acutally check against this value and then use the more abritrate values ProxyXXX
   *
   * @access public
   * @param number $value The new value for the ProxyServerType property
   * @return void
   */
  function setProxyServerType($value)
  {
    $this->_props['ProxyServerType'] = $value;
  }
  /**
   * Read accessor of UseHttpCompression.
   * flag to switch to gzip-encoding for the request. default is true which should be suitable for most situation. If using a very fast internet connection with low data amounts to retrieve might be more efficient to switch the compression of.
   * You will a suitable cURL extension for using this
   *
   * @access public
   * @return boolean Value of the UseHttpCompression property
   */
  function getUseHttpCompression()
  {
    return $this->_props['UseHttpCompression'];
  }
  /**
   * Write accessor of UseHttpCompression.
   * flag to switch to gzip-encoding for the request. default is true which should be suitable for most situation. If using a very fast internet connection with low data amounts to retrieve might be more efficient to switch the compression of.
   * You will a suitable cURL extension for using this
   *
   * @access public
   * @param boolean $value The new value for the UseHttpCompression property
   * @return void
   */
  function setUseHttpCompression($value)
  {
    $this->_props['UseHttpCompression'] = $value;
  }
  /**
   *
   * @access private
   * @var array
   */
  var $_keys = array();
  /**
   * flag to switch to gzip-encoding for the request. default is true which should be suitable for most situation. If using a very fast internet connection with low data amounts to retrieve might be more efficient to switch the compression of.
   * You will a suitable cURL extension for using this
   *
   * @access private
   * @var array
   */
  var $_debugSwitches = array();
  /**
   * Read accessor of SerializeFolder.
   * specifies a folder name for (de)serialization. Take care of any security issue on the folder (R/W for the www user or IUSR_xxx on IIS)
   *
   * @access public
   * @return string Value of the SerializeFolder property
   */
  function getSerializeFolder()
  {
    return $this->_props['SerializeFolder'];
  }
  /**
   * Write accessor of SerializeFolder.
   * specifies a folder name for (de)serialization. Take care of any security issue on the folder (R/W for the www user or IUSR_xxx on IIS)
   *
   * @access public
   * @param string $value The new value for the SerializeFolder property
   * @return void
   */
  function setSerializeFolder($value)
  {
    $this->_props['SerializeFolder'] = $value;
  }
  /**
   * Read accessor of XmlEncoding.
   * use 0 for UTF-8 encoding (default)
   * as with compat-level 401 no other values are allowed
   *
   * @access public
   * @return number Value of the XmlEncoding property
   */
  function getXmlEncoding()
  {
    return $this->_props['XmlEncoding'];
  }
  /**
   * Write accessor of XmlEncoding.
   * use 0 for UTF-8 encoding (default)
   * as with compat-level 401 no other values are allowed
   *
   * @access public
   * @param number $value The new value for the XmlEncoding property
   * @return void
   */
  function setXmlEncoding($value)
  {
    $this->_props['XmlEncoding'] = $value;
  }
  /**
   * Read accessor of DoXmlUtf8Decoding.
   * set this flag will result in decode all incoming data to iso-8859-1 using php utf8_decode.
   *
   * @access public
   * @return boolean Value of the DoXmlUtf8Decoding property
   */
  function getDoXmlUtf8Decoding()
  {
    return $this->_props['DoXmlUtf8Decoding'];
  }
  /**
   * Write accessor of DoXmlUtf8Decoding.
   * set this flag will result in decode all incoming data to iso-8859-1 using php utf8_decode.
   *
   * @access public
   * @param boolean $value The new value for the DoXmlUtf8Decoding property
   * @return void
   */
  function setDoXmlUtf8Decoding($value)
  {
    $this->_props['DoXmlUtf8Decoding'] = $value;
  }
  /**
   * Read accessor of DoXmlUtf8Encoding.
   * set this flag will result in encode all outgoing data to uft-8 assuming the data set to the objects are in iso-8859-1 characterset.
   *
   * @access public
   * @return boolean Value of the DoXmlUtf8Encoding property
   */
  function getDoXmlUtf8Encoding()
  {
    return $this->_props['DoXmlUtf8Encoding'];
  }
  /**
   * Write accessor of DoXmlUtf8Encoding.
   * set this flag will result in encode all outgoing data to uft-8 assuming the data set to the objects are in iso-8859-1 characterset.
   *
   * @access public
   * @param boolean $value The new value for the DoXmlUtf8Encoding property
   * @return void
   */
  function setDoXmlUtf8Encoding($value)
  {
    $this->_props['DoXmlUtf8Encoding'] = $value;
  }
  /**
   * Read accessor of RawLogMode.
   * Set to true to turn raw log-mode on
   *
   * @access public
   * @return boolean Value of the RawLogMode property
   */
  function getRawLogMode()
  {
    return $this->_props['RawLogMode'];
  }
  /**
   * Write accessor of RawLogMode.
   * Set to true to turn raw log-mode on
   *
   * @access public
   * @param boolean $value The new value for the RawLogMode property
   * @return void
   */
  function setRawLogMode($value)
  {
    $this->_props['RawLogMode'] = $value;
  }
  /**
   * Read accessor of RawLogPath.
   * Path where to place RawLogged Files
   *
   * @access public
   * @return string Value of the RawLogPath property
   */
  function getRawLogPath()
  {
    return $this->_props['RawLogPath'];
  }
  /**
   * Write accessor of RawLogPath.
   * Path where to place RawLogged Files
   *
   * @access public
   * @param string $value The new value for the RawLogPath property
   * @return void
   */
  function setRawLogPath($value)
  {
    $this->_props['RawLogPath'] = $value;
  }
  /**
   * Read accessor of RawLogSeq.
   * Seq No for paginated results within a Raw Logging Session, will be incremented after a log is written
   *
   * @access public
   * @return number Value of the RawLogSeq property
   */
  function getRawLogSeq()
  {
    return $this->_props['RawLogSeq'];
  }
  /**
   * Write accessor of RawLogSeq.
   * Seq No for paginated results within a Raw Logging Session, will be incremented after a log is written
   *
   * @access public
   * @param number $value The new value for the RawLogSeq property
   * @return void
   */
  function setRawLogSeq($value)
  {
    $this->_props['RawLogSeq'] = $value;
  }
  /**
   * Read accessor of RawLogName.
   * Name of the file to write in RawLogMode, if not given the API methodname is used.
   * The resulting filename is RawLogPath + "/" + RawLogName + "_" + RawLogSeq +  ".xml"
   *
   * @access public
   * @return string Value of the RawLogName property
   */
  function getRawLogName()
  {
    return $this->_props['RawLogName'];
  }
  /**
   * Write accessor of RawLogName.
   * Name of the file to write in RawLogMode, if not given the API methodname is used.
   * The resulting filename is RawLogPath + "/" + RawLogName + "_" + RawLogSeq +  ".xml"
   *
   * @access public
   * @param string $value The new value for the RawLogName property
   * @return void
   */
  function setRawLogName($value)
  {
    $this->_props['RawLogName'] = $value;
  }
  /**
   * Read accessor of RUName.
   * Returns the previously set RUName for the application instance.
   *
   * @access public
   * @return string Value of the RUName property
   */
  function getRUName(){
    return $this->_props['RUName'];
  }
  /**
   * Write accessor of RUName
   * Sets the RUName for the application instance.
   *
   * @access public
   * @param string $value The new value for the RUName property
   * @return void
   */
  function setRUName($value){
    $this->_props['RUName'] = $value;
  }
  /**
   * Read accessor of ASO Mode
   * Read the accessor of ASO Mode for the application instance.
   *
   * @access public
   * @param void
   * @return string $value The new value for the ASO Mode property
   */
  function getAsoMode(){
    return $this->_props['AsoMode'];
  }
  /**
   * Write accessor of ASO Mode
   * Sets the ASO Mode for the application instance.
   *
   * @access public
   * @param string $value The new value for the ASO Mode property
   * @return void
   */
  function setAsoMode($value){
    $this->_props["AsoMode"]=$value;
  }
  /**
   *
   * @access private
   * @var Ebay _CryptoProvider
   */
  var $_CryptoProvider = null;
  /**
   * Standard init function, should be called from the constructor(s)
   */
  function _init()
  {
    $this->_props['AppId'] = EBAY_NOTHING;
    $this->_props['DevId'] = EBAY_NOTHING;
    $this->_props['CertId'] = EBAY_NOTHING;
    $this->_props['RequestPassword'] = EBAY_NOTHING;
    $this->_props['RequestUser'] = EBAY_NOTHING;
    $this->_props['TimeOffset'] = EBAY_NOTHING;
    $this->_props['LogLevel'] = EBAY_NOTHING;
    $this->_props['LogFilename'] = EBAY_NOTHING;
    $this->_props['RUName'] = EBAY_NOTHING;
    $this->_props['LogMode'] = 0;
    $this->_props['ApiMode'] = EBAY_NOTHING;
    $this->_props['SiteId'] = EBAY_NOTHING;
    $this->_props['CompatibilityLevel'] = EBAY_NOTHING;
    $this->_props['ErrorLevel'] = EBAY_NOTHING;
    $this->_props['ErrorLanguage'] = 0;
    $this->_props['RequestTimeout'] = EBAY_NOTHING;
    $this->_props['AsoMode'] = false;
    $this->_props['TokenMode'] = false;
    $this->_props['TokenPickupFile'] = EBAY_NOTHING;
    $this->_props['TokenUsePickupFile'] = false;
    $this->_props['ApiUrl'] = EBAY_NOTHING;
    $this->_props['AppMode'] = EBAY_NOTHING;
    $this->_props['PageSize'] = 200;
    $this->_props['ProxyServer'] = EBAY_NOTHING;
    $this->_props['ProxyUidPwd'] = EBAY_NOTHING;
    $this->_props['ProxyServerType'] = EBAY_NOTHING;
    $this->_props['UseHttpCompression'] = false;
    $this->_props['SerializeFolder'] = null;
    $this->_props['XmlEncoding'] = 0;
    $this->_props['DoXmlUtf8Decoding'] = false;
    $this->_props['DoXmlUtf8Encoding'] = false;
    $this->_props['RawLogMode'] = false;
    $this->_props['RawLogPath'] = EBAY_NOTHING;
    $this->_props['RawLogSeq'] = 1;
    $this->_props['RawLogName'] = EBAY_NOTHING;
  }
  /**
   *
   * @access public
   * @param string $configFile Path to a config-file (ini-style) to read main config parameters from.
   * @return boolean
   */
  function InitFromConfig($configFile)
  {
    $cfg = parse_ini_file($configFile);
    if ($cfg == false) {
      $this->LogMsg("config file not found", 0, E_ERROR);
    }
    $this->_keys['test'] = array($cfg['app-key-test'], $cfg['dev-key-test'], $cfg['cert-id-test']);
    $this->_keys['prod'] = array($cfg['app-key-prod'], $cfg['dev-key-prod'], $cfg['cert-id-prod']);
    $this->setSiteId($cfg['site-id']);
    $this->setRequestUser($cfg['user']);
    $this->setRequestPassword($cfg['password']);
    $this->setAppMode($cfg['app-mode']);
	$this->setRUName(($this->getAppMode()<1)?$cfg['ru-name-prod']:$cfg['ru-name-test']);
    $this->setApiMode($cfg['api-mode']);
    $this->setCompatibilityLevel($cfg['compat-level']);
    $this->setErrorLevel($cfg['error-level']);
    $this->setRequestTimeout($cfg['request-timeout']);
    $this->setSerializeFolder($cfg['serialize-folder']);
    if(isset($cfg['aso-mode'])){
      $this->setAsoMode($cfg['aso-mode']);
	}
    if (isset($cfg['token-mode'])) {
      $this->setTokenMode($cfg['token-mode']);
      if (isset($cfg['token-pickup-file'])) {
        $this->setTokenPickupFile($cfg['token-pickup-file']);
        $this->setTokenUsePickupFile(true);
      }
    }
    // only utf-8 encoding is allowed !!!
    $this->setXmlEncoding(0);
    if (isset($cfg['error-language'])) {
      $this->setErrorLanguage($cfg['error-language']);
    }else {
      $this->setErrorLanguage(0);
    }
    if (isset($cfg['xml-extra-decode'])) {
      $this->setDoXmlUtf8Decoding($cfg['xml-extra-decode']);
    }else {
      $this->setDoXmlUtf8Decoding(0);
    }
    if (isset($cfg['xml-extra-encode'])) {
      $this->setDoXmlUtf8Encoding($cfg['xml-extra-encode']);
    }else {
      $this->setDoXmlUtf8Encoding(0);
    }
    if (isset($cfg['use-http-compression'])) {
      $this->setUseHttpCompression($cfg['use-http-compression']);
    }
    if (isset($cfg['log-file'])) {
      $this->setLogFilename($cfg['log-file']);
    }
    if (isset($cfg['log-level'])) {
      $this->setLogLevel($cfg['log-level']);
    }
    if (isset($cfg['log-mode'])) {
      $this->setLogMode($cfg['log-mode']);
    }
    if (isset($cfg['debug-showin'])) {
      $this->setDebugSwitch('showin');
    }
    if (isset($cfg['debug-showout'])) {
      $this->setDebugSwitch('showout');
    }
    if (isset($cfg['debug-profiling'])) {
      $this->setDebugSwitch('profiling');
    }
    if (isset($cfg['debug-curl-verbose'])) {
      $this->setDebugSwitch('curl-verbose');
    }
    if (isset($cfg['raw-log-mode'])) {
      $this->setRawLogMode($cfg['raw-log-mode']);
    }
    if (isset($cfg['raw-log-path'])) {
      $this->setRawLogPath($cfg['raw-log-path']);
    }
    if (isset($cfg['raw-log-name'])) {
      $this->setRawLogName($cfg['raw-log-name']);
    }
    if (isset($cfg['raw-log-seq'])) {
      $this->setRawLogSeq($cfg['raw-log-seq']);
    }
    if (isset($cfg['max-transactions-per-page'])) {
      $this->_props['PageSize'] = $cfg['max-transactions-per-page'];
      if ($this->_props['PageSize'] <= 0)
        $this->_props['PageSize'] = 200;
    }
  }
  /**
   * Writes a log-message to the logFile
   *
   * @access public
   * @param string $msg
   * @param number $errNo
   * @param number $severity
   * @return void
   */
  function LogMsg($msg, $errNo, $severity)
  {
    $dt = date("Y-m-d H:i:s (T)");
    $errStr = "$dt,#$errNo,$severity,$msg\r\n";
    $destination = $this->getLogFilename();
    switch ($this->getLogMode()) {
      case 0:
        error_log($errStr, 0);
        break;
      case 1:
        // TODO
        // assume the logfile name as an email address
        error_log($errStr, 1, $destination);
        break;
      case 2:
        // TODO
        // assume the logfile name as the debugger port
        error_log($errStr, 2, $destination);
        break;
      case 3:
        error_log($errStr, 3, $destination);
        break;
    } // switch
    // TODO
    // maybe die here on fatal errors
  }
  /**
   * special processing needed for AppMode
   *
   * @access public
   * @param define $value
   * @return void
   */
  function setAppMode($value)
  {
    $this->_props['AppMode'] = $value;
    // setting the URL for the API
    // recording to the AppMode selected
    switch ($value) {
      case 0:
        $this->_setProp('ApiUrl', 'https://api.ebay.com/wsapi');
        $this->_setProp('AppId', $this->_keys['prod'][0]);
        $this->_setProp('DevId', $this->_keys['prod'][1]);
        $this->_setProp('CertId', $this->_keys['prod'][2]);
        break;
      case 1:
        $this->_setProp('ApiUrl', 'https://api.sandbox.ebay.com/wsapi');
        $this->_setProp('AppId', $this->_keys['test'][0]);
        $this->_setProp('DevId', $this->_keys['test'][1]);
        $this->_setProp('CertId', $this->_keys['test'][2]);
        break;
      case 2:
        $this->_setProp('ApiUrl', 'https://api.ebay.com/wsapi');
        $this->_setProp('AppId', $this->_keys['test'][0]);
        $this->_setProp('DevId', $this->_keys['test'][1]);
        $this->_setProp('CertId', $this->_keys['test'][2]);
        break;
    }
  }
  /**
   *
   * @access public
   * @param string $configFile
   * @return void
   */
  function EbatNs_Session($configFile = null)
  {
    // call to initialisation
    // (be sure to call this always on the actual class and prevent any overwriting)
    EbatNs_Session::_init();
    $this->_props['RequestToken'] = EBAY_NOTHING;
    if ($configFile != null) {
      $this->InitFromConfig($configFile);
    }
  }
  /**
   * sets various internal debug switches
   *
   * @access public
   * @param string $switch use one the following switches (string)
   * 'showin' prints raw input (headers, xml)
   * 'showout' print raw output (xml)
   * 'logout' saves all ouput to a log-file with lays under /var/tmp with the name of the API-call and .log
   * 'pickoutlog' instead of making the call the log-file from 'logout' is picked up. Attention not suitable for paginated results.
   * 'profile' logs profiling information for any API-logs
   * @param boolean $onoff
   * @return void
   */
  function setDebugSwitch($switch, $onoff = true)
  {
    if ($onoff == true) {
      $this->_debugSwitches["$switch"] = true;
    }else {
      unset($this->_debugSwitches["$switch"]);
    }
  }
  /**
   * reads the content of the TokenFile to the Attribute RequestToken. If you are running in TokenMode the TokenFile and the Flag 'TokenUsePickupFile' is true the fill will be read whenever a call this made.
   *
   * @access public
   * @return void
   */
  function ReadTokenFile(){
    if ($this->getTokenUsePickupFile()) {
      $fname = $this->getTokenPickupFile();
      $fh = fopen($fname, "r");
      $this->_props['RequestToken'] = trim(fread($fh, filesize($fname)));
      fclose($fh);
    }
  }
  /**
   * Writes the content of the Attribute RequestToken to the TokenFile. If the ApiCaller detects a RefreshToken after a call the new token will get automatically writen to the file.
   *
   * @access public
   * @return void
   */
  function WriteTokenFile()
  {
    if ($this->getTokenUsePickupFile()) {
      $fname = $this->getTokenPickupFile();
      $fh = fopen($fname, "w+");
      fwrite($fh, $this->_props['RequestToken']);
      fclose($fh);
    }
  }
  /**
   *
   * @access public
   * @param  $ <unspecified> $data
   * @return void
   */
  function EncyrptData($data)
  {
    if ($this->_CryptoProvider != null)
      return $this->_CryptoProvider->Encrypt($data);
    else
      return $data;
  }
  /**
   *
   * @access public
   * @param  $ <unspecified> $data
   * @return void
   */
  function DecyrptData($data)
  {
    if ($this->_CryptoProvider != null)
      return $this->_CryptoProvider->Decrypt($data);
    else
      return $data;
  }
  /**
   *
   * @access public
   * @param Ebay $ _CryptoProvider $provider
   * @return void
   */
  function setCryptoProvider($provider)
  {
    $this->_CryptoProvider = $provider;
  }
  /**
   *
   * @access public
   * @return void
   */
  function getRequestToken()
  {
    return $this->DecyrptData($this->_props['RequestToken']);
  }
  /**
   *
   * @access public
   * @param string $value
   * @return void
   */
  function setRequestToken($value)
  {
    $this->_props['RequestToken'] = $this->EncyrptData($value);
  }
  /**
   *
   * @access public
   * @return void
   */
  function getHardExpirationTime()
  {
    return strtotime($this->DecyrptData($this->_props['HardExpirationTime']));
  }
  /**
   *
   * @access public
   * @param string $value
   * @return void
   */
  function setHardExpirationTime($value)
  {
    $this->_props['HardExpirationTime'] = $this->EncyrptData($value);
  }
  /**
   *
   * @access public
   * @return void
   */
  function getEIASToken()
  {
    return $this->DecyrptData($this->_props['EIASToken']);
  }
  /**
   *
   * @access public
   * @param string $value
   * @return void
   */
  function setEIASToken($value)
  {
    $this->_props['EIASToken'] = $this->EncyrptData($value);
  }
  /**
   *
   * @access public
   * @return void
   */
  function getRESTToken()
  {
    return $this->DecyrptData($this->_props['RESTToken']);
  }
  /**
   *
   * @access public
   * @param string $value
   * @return void
   */
  function setRESTToken($value)
  {
    $this->_props['RESTToken'] = $this->EncyrptData($value);
  }
  /**
   *
   * @access public
   * @param string $value
   * @return void
   */
	function getSignInUrl($SessionID="",$params=NULL){
		$url=($this->getAppMode())?"https://signin.ebay.com.au/ws/eBayISAPI.dll?":"https://signin.ebay.com.au/ws/eBayISAPI.dll?";
		$url.=($this->getAsoMode())?"SingleSignOn":"SignIn";
		$url.="&runame=".$this->getRUName()."&sflag=1&SessID=$SessionID";
		return($url);
	}
  /**
   *
   * @access public
   * @param string $value
   * @return boolean
   * @todo add in singleSignOn SSO/alreadySignedOn ASO support.
   * @todo add in config sign in URL so that SSO can be supported.
   */
	public function AuthenticateUser($Token="",$params=NULL){
		$result=false;
		$cs=new EbatNs_ServiceProxy($this);
		$SessionID=$_SESSION["__ebatsid"];
		if(strlen($SessionID)>0){
			$req=new FetchTokenRequestType();
			$req->setSessionID($SessionID);
			$req->setDetailLevel("ReturnAll");
//			$req->setIncludeRESTToken(true);
			$res=$cs->FetchToken($req);
			if(strtolower($res->getAck())=="success"){
				$this->setTokenMode(true);
				$this->setRequestToken($res->geteBayAuthToken());
				$this->setUserID($res->getRecipientUserID());
				$this->setRESTToken($res->getRESTToken());
				$this->setHardExpirationTime($res->getHardExpirationTime());
				$result=true;
			}
		}
		if(!$result){
			/* The Auth Token is Invalid or doesnt Exist - Get the eBay Session ID and redirect */
			$req=new GetSessionIDRequestType();
			$req->setRuName($this->getRUName());
			print("<h1>RUName: ".$this->getRUName().".</h1>");
			$res=$cs->GetSessionID($req);
			if(strtolower($res->getAck())=="success"){
				//Redirect the User
				$_SESSION["__ebatsid"]=$res->getSessionID();
				print("<h1>location:".$this->getSignInUrl($res->getSessionID())."</h1>");
				header("location:".$this->getSignInUrl(urlencode($res->getSessionID())));
				exit();
			}else{
				print("<h1>Error 4.</h1>");
				print("<pre>");
				print_r($res);
				print("</pre>");
			}
		}
		return($result);
	}
}

?>